package com.swordget.service.impl;

import com.swordget.entity.vo.SimplePageRequestVo;

import java.util.List;

/**
 * @Author: David
 * @Date: Created in 18:40 2020/4/7
 * @Description: 分页操作模板类
 * @Modified By:
 * @Version: 0.0.1
 */
public abstract class PaginationTemplate<T> {

    private int start;

    private int end;

    /**
     * 分页接口方法
     * @param simplePageVo
     * @param tableId
     * @return
     */
    public SimplePageRequestVo pagination(SimplePageRequestVo simplePageVo, String tableId) {

        final SimplePageRequestVo pageVo = simplePageVo;
        final String tid = tableId;

        //step1：
        paramCheck(pageVo, tid);

        //step2:
        final List<String> columns = getColumns(tid);

        //step3:
        handlerPageNum();

        //step4:
        final SimplePageRequestVo responsePaveVo = executePagination(this.start, this.end, columns);

        return responsePaveVo;
    }


    /**
     * 对参数，表做检查
     * @param simplePageVo 分页vo
     * @param tableId 表id
     */
    protected void paramCheck(SimplePageRequestVo simplePageVo, String tableId) {

    }

    /**
     * 获取查询表的列数据
     * @param tableId
     * @return
     */
    protected List<String> getColumns(String tableId) {

        return null;
    }

    /**
     * 每个数据库的分页参数处理方法不同
     * 此方法用于处理分页参数
     * start = rows * page - 1
     * end = rows * page
     * @return
     */
    protected SimplePageRequestVo handlerPageNum() {

        return null;
    }

    /**
     * 执行分页操作，这个涉及与dao 层交互，每个数据库实现各不相同，由具体子类实现
     * @param start 起始行
     * @param end 终止行
     * @param columns 查询的列集合
     * @return
     */
    abstract protected SimplePageRequestVo<T> executePagination(int start, int end, List<String> columns);

    /**
     * 钩子供调用者
     */
    protected void hock() {

    }


}
